import axios from 'axios';
import config from '../config/index';
import store from '../store';
import router from '../router'
import Cookie from 'js-cookie';
import { Loading, Message } from 'element-ui';

const loading = {
    //loading加载对象
    loadingInstance: null,
    //打开加载
    open () {
        // 32423122

        // 32432432

        if (this.loadingInstance === null) {
            // 如果实例 为空，则创建
            this.loadingInstance = Loading.service({
                text: '加载中...', //加载图标下的文字
                spinner: 'el-icon-loading', //加载图标
                background: 'rgba(0, 0, 0, 0.8)', //背景色
                customClass: 'loading', //自定义样式的类名
            });
        }
    },
    //关闭加载
    close () {
        // 不为空时, 则关闭加载窗口
        if (this.loadingInstance !== null) {
            this.loadingInstance.close();
        }
        this.loadingInstance = null;
    },
};

// 判断目前在什么环境下  生产环境还是开发环境
const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro;
// const baseUrl = config.baseApi;

class HttpRequest {
    constructor(baseUrl) {
        this.baseUrl = baseUrl;
    }
    // 定义 axios 的相关配置
    getInsideConfig () {
        const config = {
            baseUrl: this.baseUrl,
            headers: {
                token: store.state.user.token,
            },
            method: 'get',
        };
        return config;
    }

    interceptors (instance) {
        // 添加请求拦截器
        instance.interceptors.request.use(
            function (config) {
                loading.open(); //打开加载窗口
                // 在发送请求之前做些什么
                return config;
            },
            function (error) {
                // 对请求错误做些什么
                return Promise.reject(error);
            }
        );

        // 添加响应拦截器
        instance.interceptors.response.use(
            function (response) {
                loading.close(); //关闭加载窗口
                // 对响应数据做点什么
                if (response.data.code === 0) {
                    const data = response.data.data;
                    return data;
                } else if (response.data.code === 1) {
                    Message({
                        //elemen组件库中的提示组件
                        message: response.data.msg,
                        type: 'error',
                        duration: 5000,
                    });
                }
            },
            function (error) {
                console.log(error);
                loading.close(); //关闭加载窗口
                if (error.response) {
                    let { status, data } = error.response;
                    if (status === 400) {
                        Message({
                            //elemen组件库中的提示组件
                            message: data.msg,
                            type: 'error',
                            duration: 5000,
                        });
                        if (data.code == 2) {
                            store.state.user.token = '';
                            Cookie.remove('token');
                            router.push({
                                name: 'login',
                            })
                        }
                    }
                } else {
                    Message({
                        //elemen组件库中的提示组件
                        message: error.code,
                        type: 'error',
                        duration: 5000,
                    });
                    // 对响应错误做点什么
                    return Promise.reject(error);
                }
            }
        );
    }

    request (options) {
        const instance = axios.create();
        options.url = this.baseUrl + options.url;
        options = { ...this.getInsideConfig(), ...options };
        console.log(options);
        this.interceptors(instance);
        return instance(options);
    }
}

export default new HttpRequest(baseUrl);
